package ReferenceDemo;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * 作者  Administrator
 * 时间  2017/1/18 16:35
 * 文件  JAVAOOM
 * 描述  ReferenceQueen当对象被回收时，会被添加到该对象中
 */
public class ReferenceQueenTest {

	public static void main(String[] args) {
		A a = new A();
		ReferenceQueue<A> aReferenceQueue = new ReferenceQueue<>();
		WeakReference<A> aWeakReference = new WeakReference<A>(a,aReferenceQueue);//回收队列

		/**
		 * 1、验证一下，当对象进入垃圾回收流程(gc) 才会被插入引用队列中
		 * */
		a=null;//并没有回收 不信往下看

		if (aWeakReference.get()==null){
			System.out.println("a对象进入了垃圾回收流程");
		}else {
			System.out.println("a对象尚未被回收"+aWeakReference.get());
		}
		// 看看引用队列中有没有看到被回收的对象
		System.out.println("引用队列item："+aReferenceQueue.poll());

		System.gc();//强制回收

		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		if (aWeakReference.get()==null){
			System.out.println("a对象进入了垃圾回收流程");
		}else {
			System.out.println("a对象尚未被回收"+aWeakReference.get());
		}
		// 看看引用队列中有没有看到被回收的对象
		System.out.println("引用队列item："+aReferenceQueue.poll());

/**		运行结果
		a对象尚未被回收ReferenceDemo.A@1b6d3586
		引用队列item：null
		a对象进入了垃圾回收流程
		引用队列item：java.lang.ref.WeakReference@4554617c
		A:finalize
        验证了吧
 */


	}
}
